package teams;

import java.util.HashSet;
import java.util.Set;

import players.FutbolPlayer;
import players.Position;

/**
 * Representa un Equipo de Futbol
 */
public class Team implements Nameable {

    private String name;

    private Coach coach;

    private Set<FutbolPlayer> players;

    private Integer id;

    /**
     * Constructor de Equipo que incluye Nombre, Tecnico y Lista de Jugadores
     * 
     * @param name
     *            : Nombre del Equipo
     * @param coach
     *            : Tecnico del Equipo
     * @param players
     *            : Lista de Jugadores del Equipo
     */
    public Team(final String name, final Coach coach, final Set<FutbolPlayer> players) {
        this.name = name;
        this.coach = coach;
        this.players = players;
    }

    public Team(final String name) {
        this.name = name;
        this.coach = null;
        this.players = new HashSet<FutbolPlayer>();
    }

    // Constructor vacio para el Hibernate.
    protected Team() {

    }

    public Formation buildFormation() {
        return this.getCoach().buildFormation(this);
    }

    /**
     * Obtiene el Jugador mas habil del Equipo para la posicion recibida. Si ya esta entre los titulares de la
     * Formacion, busca el siguiente mas habil.
     * 
     * Se asume que la Formacion es la del Equipo receptor, y tiene al menos 1 Jugador suplente.
     * 
     * @param position
     *            : Posicion que se quiere verificar en los Jugadores
     * @param formation
     *            : Formacion actual del Equipo
     */
    public FutbolPlayer getBestPlayer(final Position position, final Formation formation) {
        FutbolPlayer bestPlayer = null;
        for (FutbolPlayer currentPlayer : this.getPlayers()) {
            if (formation.getSubstitutes().contains(currentPlayer)
                    && (bestPlayer == null || currentPlayer.getValueOfSkill(position) >= bestPlayer
                            .getValueOfSkill(position))) {
                bestPlayer = currentPlayer;
            }
        }
        return bestPlayer;
    }

    @Override
    public String toString() {
        return this.name;
    }

    @Override
    public String getName() {
        return this.name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public Coach getCoach() {
        return this.coach;
    }

    public void setCoach(final Coach coach) {
        this.coach = coach;
    }

    public Set<FutbolPlayer> getPlayers() {
        return this.players;
    }

    public void setPlayers(final Set<FutbolPlayer> players) {
        this.players = players;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(final Integer id) {
        this.id = id;
    }

}
